importlib

您所在的位置:网站首页 python importlib 模块路径 importlib

importlib

2023-12-18 05:51| 来源: 网络整理| 查看: 265

重新加载之前导入的 模块 。 参数必须是一个模块对象,所以它之前必须成功导入。 如果您使用外部编辑器编辑了模块源文件并希望在不离开 Python 解释器的情况下试用新版本,这将非常有用。 返回值是模块对象(如果重新导入导致将不同的对象放置在 sys.modules 中,则可能会有所不同)。

当执行 reload() 时:

重新编译 Python 模块的代码并重新执行模块级代码,通过重用最初加载模块的 loader 定义一组新的对象,这些对象绑定到模块字典中的名称。 扩展模块的 init 函数不会被第二次调用。

与 Python 中的所有其他对象一样,旧对象仅在其引用计数降至零后才会被回收。

模块命名空间中的名称更新为指向任何新的或更改的对象。

对旧对象的其他引用(例如模块外部的名称)不会重新引用到新对象,并且如果需要,必须在它们出现的每个命名空间中更新。

还有一些其他注意事项:

重新加载模块时,会保留其字典(包含模块的全局变量)。 名称的重新定义将覆盖旧定义,因此这通常不是问题。 如果模块的新版本未定义由旧版本定义的名称,则旧定义保留。 如果模块维护全局表或对象缓存,则此功能可用于模块的优势 - 通过 try 语句,它可以测试表的存在并在需要时跳过其初始化:

try: cache except NameError: cache = {}

重新加载内置或动态加载的模块通常不是很有用。 不建议重载 sys、__main__、builtins 等关键模块。 在许多情况下,扩展模块不会被设计为多次初始化,并且在重新加载时可能会以任意方式失败。

如果一个模块使用 from ... import ... 从另一个模块导入对象,则为另一个模块调用 reload() 不会重新定义从它导入的对象——一个解决这个问题的方法是重新执行 from 语句,另一种是使用 import 和限定名称 (module.name) 代替。

如果模块实例化类的实例,重新加载定义类的模块不会影响实例的方法定义——它们继续使用旧的类定义。 对于派生类也是如此。

3.4 版中的新功能。

3.7 版更改:当重新加载的模块缺少 ModuleSpec 时,会引发 ModuleNotFoundError。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3